/**
 * 1. Promise 就是一个类 在执行这个类的时候  需要传递一个执行器进去 执行器会立即执行
 * 2. Promise 有三种状态, 分别为成功 fulfilled 失败 rejected 等待 pending
 *    pending -> fulfilled
 *    pending -> rejected
 * 3. resolve 和reject 函数是用来更改状态的
 *    resolve: fulfilled
 *    reject: rejected
 * 4. then方法内部做的事情就判断状态 如果状态是成功 调用成功的回调函数 如果状态是失败 调用失败的回调函数 then方法是被定义在原型对象上的方法
 * 5. then 成功回调有一个参数 表示成功之后的值 失败回调有一个参数 表示失败回调的原因
 * 6. 同一个promise对象下面的then方法是可以被调用多次的
 * 7. then方法是可以被链式调用的, 后面then方法的回调函数拿到值的是上一个then方法的回调函数的返回值
 * 
 * 
 */

const MyPromise = require('./myPromise')


let promise = new MyPromise((resolve, reject) => {
    // setTimeout(()=>{
    //     resolve('成功 ..........')
    // }, 2000)
    // throw new Error('executor error')
    // resolve('成功')
    reject('失败')
})


// then 捕获错误 需添加trycatch MyPromise的contructor函数执行 还有就是then的成功和失败回调函数返回结果处 或者then等待状态
// promise.then(res=>{
//     console.log(res, 'value')
//     // throw new Error('then error')
//     return 'aaa'
// }, error => {
//     console.log(error, '1error')
//     return 1000
// }).then(value => {
//     console.log('valuereject', value)
// })
// promise.then(res=>{
//     console.log(res, 'value')
// }, error => {
//     console.log(error, '2error')
// })
// promise.then(res=>{
//     console.log(res, 'value')
// }, error => {
//     console.log(error, '3error')
// })
// promise.then(res=>{
//     console.log(res, '1value')
// })
// promise.then(res=>{
//     console.log(res, '2value')
// })
// promise.then(res=>{
//     console.log(res, '3value')
// })


// function other(){
//     return new MyPromise((resolve, reject) => {
//         resolve('other')
//     })
// }


// promise.then(res=>{
//     console.log(res, 'value')
//     return 2
// }).then(res => {
//     console.log(res, '2代 then')
// })
// promise.then(res=>{
//     console.log(res, 'value')
//     return other()
// }).then(res => {
//     console.log(res, '2代 then')
// })



// ******* then方法可以返回Promise对象,但是一种情况例外: 返回的Promise对象不可以是当前then方法返回的对象 如果返回了就产生了Promise对象循环调用,JS不会允许会报错
// 演示这种错误 test.html
// let p1 = promise.then(res=>{
//     console.log(res, 'value')
//     return p1
// })
// p1.then(res=>{
//     console.log(res, 'value')
// }, reason => {
//     console.log('reason', reason.message)
// })



// then方法参数变为可选参数
// promise.then().then().then(value => console.log(value), reason => console.log(reason))



// Promise.all()
// function p1() {
//     return new MyPromise((resolve, reject) => {
//         setTimeout(() => {
//             resolve('p1')
//         }, 2000)
//     })
// }
// function p2() {
//     return new MyPromise((resolve, reject) => {
//         resolve('p2')
//     })
// }
// MyPromise.all(['a', 'b', p1(), p2(), 'c']).then(result => {
//     console.log(result, 'result')
// })



// Promise.resolve方法的实现
// function p2() {
//     return new MyPromise((resolve, reject) => {
//         resolve('p2')
//     })
// }
// MyPromise.resolve(100).then(value => console.log('resolve方法 value', value))
// MyPromise.resolve(p2()).then(value => console.log('resolve方法 value', value))

// finally方法
function p1() {
    return new MyPromise((resolve, reject) => {
        setTimeout(() => {
            resolve('p1')
        }, 2000)
    })
}
function p2() {
    return new MyPromise((resolve, reject) => {
        reject('p2 reject')
        // resolve('p2 resolve')
    })
}
//  p2().finally(()=>{
//      console.log('finally')
//      return p1()
//  }).then(value => {
//      console.log(value, 'resolve')
//  }, reason => {
//      console.log(reason, 'reject')
//  })

//  catch 方法实现
p2().then(value => console.log(value))
.catch(error => console.log(error, 'error catch'))


// let thenable = {
//     then(resolve, reject){
//         resolve('resolve dkdkdkdkdkdk')
//     }
// }

// Promise.resolve(thenable).then(value => {
//     console.log(value, thenable, value === thenable)
// })
// Promise.reject(thenable).catch(value => {
//     console.log(value, thenable, value === thenable, 'dddddddd')
// })







